﻿using FlyingCircusWebIS.Models;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Data.OleDb;
using System.Linq;
using System.Web;

namespace FlyingCircusWebIS.Models
{
    public class TelefoneDAO: ITelefoneDAO
    {
        public void Adicionar(Telefone entidade, DbTransaction transacao = null)
        {
            string sqlAtualizar
                = "insert into TELEFONE (IdTelefone, IdPessoa, Telefone) values (seqTelefone.nextval, ?, ?)";

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlAtualizar;
            if (transacao != null)
                comando.Transaction = transacao as OleDbTransaction;

            OleDbParameter pIdPessoa = new OleDbParameter("IdPessoa", OleDbType.Integer);
            pIdPessoa.Value = entidade.IdPessoa;
            comando.Parameters.Add(pIdPessoa);

            OleDbParameter pTelefone = new OleDbParameter("Telefone", OleDbType.VarChar);
            pTelefone.Value = entidade.TelefoneNumero;
            comando.Parameters.Add(pTelefone);

            // Insert
            comando.ExecuteNonQuery();
            comando.Dispose();
        }

        public void Atualizar(Telefone entidade, DbTransaction transacao = null)
        {
            string sqlAtualizar
                = "update TELEFONE set IdPessoa = ?, Telefone = ? where IdTelefone = ?";

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlAtualizar;
            if (transacao != null)
                comando.Transaction = transacao as OleDbTransaction;

            OleDbParameter pIdPessoa = new OleDbParameter("IdPessoa", OleDbType.Integer);
            pIdPessoa.Value = entidade.IdPessoa;
            comando.Parameters.Add(pIdPessoa);

            OleDbParameter pTelefone = new OleDbParameter("Telefone", OleDbType.VarChar);
            pTelefone.Value = entidade.TelefoneNumero;
            comando.Parameters.Add(pTelefone);

            OleDbParameter pIdTelefone = new OleDbParameter("IdTelefone", OleDbType.Integer);
            pIdTelefone.Value = entidade.IdTelefone;
            comando.Parameters.Add(pIdTelefone);

            // Update
            comando.ExecuteNonQuery();
            comando.Dispose();
        }

        public void RemoverPorId(int id, DbTransaction transacao)
        {
            string sqlDeletar = "delete TELEFONE where IdTelefone = ?";

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlDeletar;
            if (transacao != null)
                comando.Transaction = transacao as OleDbTransaction;
                
            OleDbParameter pId = new OleDbParameter("IdTelefone", OleDbType.VarChar);
            pId.Value = id;
            comando.Parameters.Add(pId);

            // Delete
            comando.ExecuteNonQuery();
            comando.Dispose();
        }

        public Telefone BuscarPorId(int id)
        {
            Telefone registro = null;
            string sqlBuscar = "select * from TELEFONE where IdTelefone = ?";

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlBuscar;

            OleDbParameter pId = new OleDbParameter("IdTelefone", OleDbType.Integer);
            pId.Value = id;
            comando.Parameters.Add(pId);

            // Select
            OleDbDataReader dr = comando.ExecuteReader();
            if (dr.Read())
            {
                registro = ConverterDataReaderParaObj(dr);
            }
            dr.Close();
            comando.Dispose();

            return registro;
        }

        private Telefone ConverterDataReaderParaObj(OleDbDataReader dr)
        {
            Telefone telefone = new Telefone();
            telefone.IdTelefone = Int32.Parse(dr["IdTelefone"].ToString());
            telefone.IdPessoa = Int32.Parse(dr["IdPessoa"].ToString());
            telefone.TelefoneNumero = dr["Telefone"].ToString();
            return telefone;
        }

        public List<Telefone> Listar()
        {
            String sqlConsulta = "select * from TELEFONE";

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlConsulta;

            // Select
            OleDbDataReader dr = comando.ExecuteReader();

            List<Telefone> registros = new List<Telefone>();
            while (dr.Read())
            {
                Telefone registro = ConverterDataReaderParaObj(dr);
                registros.Add(registro);
            }
            dr.Close();
            comando.Dispose();

            return registros;
        }



        public int ProximoIdTelefone(DbTransaction transacao = null)
        {
            string sqlConsultar
                = "select seqTelefone.nextval from dual";

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlConsultar;
            if (transacao != null)
                comando.Transaction = transacao as OleDbTransaction;

            // Select
            OleDbDataReader dr = comando.ExecuteReader();

            if (dr.Read())
            {
                int id = Convert.ToInt32(dr["NEXTVAL"]);
                dr.Close();
                comando.Dispose();

                return id;
            }

            dr.Close();
            comando.Dispose();
            throw new Exception("Erro ao recuperar o próximo ID de telefone.");

        }


        public List<Telefone> ListarPorIdPessoa(int idPessoa)
        {
            String sqlConsulta = "select * from TELEFONE where IdPessoa = " + idPessoa;

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlConsulta;

            // Select
            OleDbDataReader dr = comando.ExecuteReader();

            List<Telefone> registros = new List<Telefone>();
            while (dr.Read())
            {
                Telefone registro = ConverterDataReaderParaObj(dr);
                registros.Add(registro);
            }
            dr.Close();
            comando.Dispose();

            return registros;
        }


        public void RemoverPorIdPessoa(int id, DbTransaction transacao)
        {
            string sqlDeletar = "delete TELEFONE where IdPessoa = ?";

            // Configura o comando
            OleDbCommand comando = new OleDbCommand();
            comando.Connection = GerenciadorConexao.Conexao;
            comando.CommandText = sqlDeletar;
            if (transacao != null)
                comando.Transaction = transacao as OleDbTransaction;

            OleDbParameter pId = new OleDbParameter("IdTelefone", OleDbType.VarChar);
            pId.Value = id;
            comando.Parameters.Add(pId);

            // Delete
            comando.ExecuteNonQuery();
            comando.Dispose();
        }
    }
}